/**
* Copyright (c) 2022 - present TinyVue Authors.
* Copyright (c) 2022 - present Huawei Cloud Computing Technologies Co., Ltd.
*
* Use of this source code is governed by an MIT-style license.
*
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
*
*/

import { mapTree } from '@opentiny/vue-renderless/grid/static'
import { copyArray } from '@opentiny/vue-renderless/common/object'

export const dialogTitle = ({ constants, props, t }) => () => props.title || t(constants.DIALOG_TITLE)

export const showDialog = (state) => () => (state.boxVisibility = true)

export const hideDialog = ({ api, state, vm, props }) => () => {
  if (!props.keepSelectedNodes) {
    state.currentCheckNode.forEach((item) => {
      const isNode = state.listItem.filter((data) => data.id === item.id)

      if (isNode.length) {
        vm.$refs.tree.setChecked(item, true, true)

        if (item.disabled !== undefined) {
          item.disabled = false
        }
      } else {
        vm.$refs.tree.setChecked(item, false, true)
      }
    })

    state.getNodeValue = copyArray(state.listItem)

    if (state.getNodeValue.length === props.maxItem) {
      api.disabledTreeNode(state.getNodeValue, true)
    } else if (state.getNodeValue.length < props.maxItem) {
      api.disabledTreeNode(state.getNodeValue, false)
    }

    state.currentCheckNode = []
  }

  state.boxVisibility = false
}

export const sureNodevalue = (state) => () => {
  state.listItem = state.getNodeValue.slice()
  state.currentCheckNode = []
  state.boxVisibility = false
}

export const filterNode = () => (value, data) => data.label.indexOf(value) !== -1

export const getValue = ({ api, props, state }) => (value) => {
  if (!props.keepSelectedNodes) {
    state.currentCheckNode.push(value)
  }

  let index = -1

  state.getNodeValue.forEach((data, indexx) => {
    if (data.id === value.id) {
      index = indexx
    }
  })

  index !== -1 ? state.getNodeValue.splice(index, 1) : state.getNodeValue.push(value)

  if (state.getNodeValue.length === props.maxItem) {
    api.disabledTreeNode(state.getNodeValue, true)
  } else if (state.getNodeValue.length < props.maxItem) {
    api.disabledTreeNode(state.getNodeValue, false)
  }
}

export const disabledTreeNode = (state) => (arr, isDisabled) => {
  state.datas.forEach((item) => {
    if (!item.children) {
      const index = arr.filter((data) => data.id === item.id)

      if (!index.length) {
        item.disabled = isDisabled
      }
    } else {
      item.children.forEach((item) => {
        const index = arr.filter((data) => data.id === item.id)

        if (!index.length) {
          item.disabled = isDisabled
        }
      })
    }
  })
}

export const initData = ({ state, props, service, api }) => () => {
  let data = props.data

  if (!data && typeof service.getMenuDataSync === 'function') {
    const menuData = service.getMenuDataSync()
    data = api.setMenuKey({ newData: [], menuData })
  }

  state.datas = mapTree(data || [], (item) => ({ ...item, disabled: false }))
}

export const disabledParentNode = (state) => () => {
  state.datas.forEach((item) => {
    if (item.children) {
      item.disabled = true
    }
  })
}

export const initService = ({ props, service }) => {
  const $service = service || { base: {} }

  return {
    getMenuDataSync: props.getMenuDataSync || $service.base.getMenuDataSync
  }
}
